package cn.seaboot.commons.core;

import cn.seaboot.commons.lang.P;

import java.util.Date;

/**
 * 更加智能合理的文本展示
 *
 * 目前包含文件大小和时间差值的数字格式化
 *
 * @author Mr.css
 * @version 2023-02-20 18:42
 */
public class SmartText {

    /**
     * 数字用 0 补齐
     *
     * @param num 数字
     * @param len 数据长度
     * @return -
     */
    public static String fillZero(int num, int len) {
        String str = Integer.toString(num);
        int n = len - str.length();
        if(n < 0){
            throw new StringIndexOutOfBoundsException("number is out of max size, the num is: " + num + " and the size is:" + len);
        }if (n == 0) {
            return str;
        } else if (n == 1) {
            return "0" + str;
        } else if (n == 2) {
            return "00"+ str;
        } else {
            StringBuilder sb = new StringBuilder(len);
            for (int i = 0; i < n; i++) {
                sb.append('0');
            }
            sb.append(str);
            return sb.toString();
        }
    }

    /**
     * 字节转换
     *
     * @param size 字节大小
     * @return 转换后值
     */
    public static String fileSize(long size) {
        if (size >= P.GB) {
            return size / P.GB + "GB";
        } else if (size >= P.MB) {
            return size / P.MB + "MB";
        } else if (size >= P.KB) {
            return size /  P.KB + "KB";
        } else {
            return size + "B";
        }
    }


    /**
     * 计算时间差
     *
     * @param statDate 开始时间
     * @param endDate  结束时间
     * @return 中文时间差
     */
    public static String elapseTime(Date statDate, Date endDate) {
        long time = endDate.getTime() - statDate.getTime();
        return elapseTime(time);
    }

    /**
     * 计算时间差
     *
     * @param ms 时间毫秒数
     * @return 中文时间差
     */
    public static String elapseTime(long ms) {
        ms = Math.abs(ms);
        if (ms >= P.MS_DAY) {
            return ms / P.MS_DAY + "天";
        } else if (ms >= P.MS_HOUR) {
            return ms / P.MS_HOUR + "小时";
        } else if (ms >= P.MS_MINUTE) {
            return ms / P.MS_MINUTE + "分";
        } else {
            return (ms / P.MS_SECOND) + "秒";
        }
    }

    /**
     * 更加完整的时间差
     *
     * @param ms   时间毫秒数
     * @param trim 是否去除0值
     * @return 中文时间差
     */
    public static String fullyElapseTime(long ms, boolean trim) {
        ms = Math.abs(ms);
        long d = ms / P.MS_DAY;
        ms %= P.MS_DAY;
        long h = ms / P.MS_HOUR;
        ms %= P.MS_HOUR;
        long m = ms / P.MS_MINUTE;
        ms %= P.MS_MINUTE;
        long s = ms / P.MS_SECOND;
        StringBuilder sb = new StringBuilder();
        if (!trim || d != 0) {
            sb.append(d).append("天");
        }
        if (!trim || h != 0) {
            sb.append(h).append("小时");
        }
        if (!trim || m != 0) {
            sb.append(m).append("分");
        }
        if (!trim || s != 0) {
            sb.append(s).append("秒");
        }
        return sb.toString();
    }
}
